const { ethers } = require('ethers');
require('dotenv').config();

/**
 * IPFS URI 修复脚本
 * 解决你的IPFS URI访问问题
 */

// 你的配置信息
const CONFIG = {
    // 你的metadata文件hash
    metadataHash: "QmbQuC2AunXG1RyDyfkTrL4SyGQ6zurNzBag8zeFxALXkK",

    // 你的IPFS文件夹hash
    ipfsFolderHash: "QmYP7zPrdxLPeJ4h3YghxYZ7YYn3dYjF1R25TxfG9cG3jn",

    // 网络配置
    rpcUrl: process.env.SEPOLIA_RPC_URL,
    privateKey: process.env.PRIVATE_KEY,

    // 合约地址（请替换为你的实际合约地址）
    contractAddress: "YOUR_CONTRACT_ADDRESS_HERE"
};

async function fixIPFSUri() {
    console.log("🔧 IPFS URI 修复脚本");
    console.log("=" * 50);

    // 检查配置
    if (CONFIG.contractAddress === "YOUR_CONTRACT_ADDRESS_HERE") {
        console.error("❌ 请先设置正确的合约地址！");
        console.log("📝 在CONFIG.contractAddress中设置你的合约地址");
        return;
    }

    try {
        // 初始化provider和wallet
        const provider = new ethers.providers.JsonRpcProvider(CONFIG.rpcUrl);
        const wallet = new ethers.Wallet(CONFIG.privateKey, provider);

        console.log(`📝 钱包地址: ${wallet.address}`);
        console.log(`🔗 合约地址: ${CONFIG.contractAddress}`);

        // 合约ABI（简化版）
        const contractABI = [
            "function mintNFT(address to, string memory _tokenURI) public payable returns (uint256)",
            "function tokenURI(uint256 tokenId) public view returns (string)",
            "function setBaseURI(string memory newBaseURI) public",
            "function baseURI() public view returns (string)",
            "function totalSupply() public view returns (uint256)"
        ];

        const contract = new ethers.Contract(CONFIG.contractAddress, contractABI, wallet);

        console.log("\n🎯 解决方案1: 使用完整的IPFS URI（推荐）");
        console.log("-" * 40);

        // 方案1: 使用完整的IPFS URI
        const fullUri = `ipfs://${CONFIG.metadataHash}`;
        console.log(`📤 铸造URI: ${fullUri}`);

        const tx1 = await contract.mintNFT(
            wallet.address,
            fullUri,
            { value: ethers.utils.parseEther("0") }
        );

        console.log(`⏳ 交易哈希: ${tx1.hash}`);
        await tx1.wait();
        console.log("✅ 铸造成功");

        // 查询结果
        const totalSupply = await contract.totalSupply();
        const tokenId = totalSupply.toNumber();
        const tokenURI = await contract.tokenURI(tokenId);

        console.log(`🆔 Token ID: ${tokenId}`);
        console.log(`🔗 最终URI: ${tokenURI}`);

        // 验证
        if (tokenURI === fullUri) {
            console.log("✅ URI验证成功！");
        } else {
            console.log("❌ URI验证失败！");
        }

        console.log("\n🌐 测试IPFS访问:");
        console.log(`🔍 你可以在浏览器中访问以下URL来测试:`);
        console.log(`   - https://ipfs.io/ipfs/${CONFIG.metadataHash}`);
        console.log(`   - https://gateway.pinata.cloud/ipfs/${CONFIG.metadataHash}`);
        console.log(`   - https://cloudflare-ipfs.com/ipfs/${CONFIG.metadataHash}`);

        console.log("\n🎯 解决方案2: 使用baseURI + 文件名");
        console.log("-" * 40);

        // 方案2: 使用baseURI + 文件名
        const baseURI = `ipfs://${CONFIG.ipfsFolderHash}/`;
        console.log(`🔧 设置baseURI: ${baseURI}`);

        const setBaseTx = await contract.setBaseURI(baseURI);
        await setBaseTx.wait();
        console.log("✅ baseURI设置成功");

        // 铸造使用文件名
        const filename = "metadata/1.json";
        console.log(`📤 铸造文件名: ${filename}`);

        const tx2 = await contract.mintNFT(
            wallet.address,
            filename,
            { value: ethers.utils.parseEther("0") }
        );

        console.log(`⏳ 交易哈希: ${tx2.hash}`);
        await tx2.wait();
        console.log("✅ 铸造成功");

        // 查询结果
        const totalSupply2 = await contract.totalSupply();
        const tokenId2 = totalSupply2.toNumber();
        const tokenURI2 = await contract.tokenURI(tokenId2);

        console.log(`🆔 Token ID: ${tokenId2}`);
        console.log(`🔗 最终URI: ${tokenURI2}`);

        // 验证
        const expectedURI = `${baseURI}${filename}`;
        if (tokenURI2 === expectedURI) {
            console.log("✅ URI验证成功！");
        } else {
            console.log("❌ URI验证失败！");
            console.log(`预期: ${expectedURI}`);
            console.log(`实际: ${tokenURI2}`);
        }

        console.log("\n📊 总结:");
        console.log("✅ 方案1: 直接使用完整的IPFS URI");
        console.log("✅ 方案2: 使用baseURI + 文件名");
        console.log("\n💡 推荐使用方案1，因为更简单直接！");

    } catch (error) {
        console.error("❌ 错误:", error.message);

        if (error.message.includes("insufficient funds")) {
            console.log("💡 提示: 请确保钱包有足够的ETH支付gas费用");
        } else if (error.message.includes("nonce")) {
            console.log("💡 提示: 请等待之前的交易完成后再试");
        } else if (error.message.includes("contract")) {
            console.log("💡 提示: 请检查合约地址是否正确");
        }
    }
}

// 运行修复脚本
if (require.main === module) {
    fixIPFSUri().catch(console.error);
}

module.exports = { fixIPFSUri, CONFIG };
